<?php

App::uses('AppController', 'Controller');

class IndexController extends AppController {
    /**
     * 				CONTROLLER DATA MEMBERS
     */

    /**
     * Nombre del controlador
     *
     * Nombre del controlador
     *
     * @var string
     */
    public $name = "Index"; //name of the controller. Usually this is just the plural form of the primary model the controller uses
    /**
     * Modelos que utiliza
     *
     * Los modelos que usa el controller. Por defecto
     * cake usa el singular basado en el nombre del modelo,
     * pero por asuntos del idioma siempre se ingresa el modelo
     * para evitar posibles problemas.
     *
     * @var array(string)
     */
    public $uses = array('Ruta', "RecorridoRealizado", 'Recorrido', 'Horario', 'RutaParada', 'Parada', 'Reserva', 'WaypointAyuda', 'RecorridoRealizadoEvento');  //Allows a controller to access additional models. name of the current controller’s model must also be included if uses is present
    /**
     * Componentes que utiliza
     *
     * Componentes que utiliza el controlador
     *
     * @var array(string)
     */
    public $components = array("Session");  //make available packages of logic that are shared between controllers

    /**
     * 				CONTROLLER CALLBACKS METHODS
     */

    // public function beforeFilter() {
    // }
    // public function afterFilter() {
    // }
    // public function beforeRender() {
    // }

    /**
     * 				CONTROLLER METHODS (ACTIONS)
     */

    /**
     * Action por defecto para el Index
     *
     * Este es el metodo base de Index, en este metodo
     * se buscan las rutas almacenadas en el sistema y se
     * devuelven a la vista para que el usuario pueda visualizar
     * las rutas activas del momento
     *
     * @return void
     */
    public function index() {
        $this->layout = "miBus";
        $this->set("refresh_time", Configure::read('Index.refresh_time'));
        $this->set("refresh_ajax_url", Router::url(array('controller' => 'Index', 'action' => 'data'), true));
        $this->set("reservas_ajax_url", Router::url(array('controller' => 'Reservas', 'action' => 'agregar_ajax'), true));
        $this->set("id_parada_eia_palmas", Configure::read('Paradas.id_parada_eia_palmas'));

        $recorridos_realizados = $this->RecorridoRealizado->findNoFinalizadosAndNoProgramados();
        $length = sizeof($recorridos_realizados);
        for ($i = 0; $i < $length; $i++) {
            $ruta_parada = $this->RutaParada->find('first', array(
                'conditions' => array(
                    'RutaParada.id_ruta' => $recorridos_realizados[$i]["Recorrido"]["id_ruta"]
                ),
                'order' => array('orden_ruta DESC')
            ));
            $recorridos_realizados[$i]["Ruta"] = $ruta_parada["Ruta"];
            $recorridos_realizados[$i]["ParadaDestino"] = $ruta_parada["Parada"];

            $horario = $this->Horario->find('first', array(
                'conditions' => array(
                    'Horario.id_horario' => $recorridos_realizados[$i]["Recorrido"]["id_horario"]
                ),
                'recursive' => 0
            ));
            $recorridos_realizados[$i]["Horario"] = $horario["Horario"];
            if ($recorridos_realizados[$i]["RecorridoRealizado"]["estado_recorrido_realizado"] == 'evento') {
                $recorrido_realizado_evento = $this->RecorridoRealizadoEvento->find('first', array(
                    'conditions' => array(
                        'RecorridoRealizadoEvento.id_recorrido_realizado' => $recorridos_realizados[$i]["RecorridoRealizado"]["id_recorrido_realizado"]
                    ),
                    'order' => array('RecorridoRealizadoEvento.fecha_hora_evento DESC')
                ));
                $recorridos_realizados[$i]["Evento"] = $recorrido_realizado_evento["Evento"];
            }
        }
        $this->set("recorridos_realizados", $recorridos_realizados);

        $reservas_programadas = $this->Reserva->findProgramadas($this->Session->read('phpCAS')["attributes"]["NumeroIdentificacion"]);
        for ($i = sizeof($reservas_programadas) - 1; $i >= 0; $i--) {
            $reservas_programadas[$i]["Recorrido"] = $this->Recorrido->find('first', array(
                        'conditions' => array("Recorrido.id_recorrido" => $reservas_programadas[$i]["RecorridoRealizado"]["id_recorrido"]),
                        'recursive' => -1,
                    ))["Recorrido"];
            $reservas_programadas[$i]["Ruta"] = $this->Ruta->find('first', array(
                        'conditions' => array("Ruta.id_ruta" => $reservas_programadas[$i]["Recorrido"]["id_ruta"]),
                        'recursive' => -1,
                    ))["Ruta"];
            $reservas_programadas[$i]["Horario"] = $this->Horario->find('first', array(
                        'conditions' => array("Horario.id_horario" => $reservas_programadas[$i]["Recorrido"]["id_horario"]),
                        'recursive' => -1,
                    ))["Horario"];

            $this->RutaParada->unbindModel(
                    array('belongsTo' => array('Ruta'))
            );
            $paradas = $this->RutaParada->find('all', array(
                'conditions' => array("RutaParada.id_ruta" => $reservas_programadas[$i]["Recorrido"]["id_ruta"]),
                'recursive' => 0,
                'order' => array('RutaParada.orden_ruta ASC'),
            ));
            if ($paradas[0]['RutaParada']['id_parada'] == Configure::read('Paradas.id_parada_eia_palmas')) {
                $reservas_programadas[$i]["ParadaOrigen"] = $paradas[0]['Parada'];
                $reservas_programadas[$i]["ParadaDestino"] = $reservas_programadas[$i]["Parada"];
            } else {
                $reservas_programadas[$i]["ParadaDestino"] = $paradas[sizeof($paradas) - 1]['Parada'];
                $reservas_programadas[$i]["ParadaOrigen"] = $reservas_programadas[$i]["Parada"];
            }
            unset($reservas_programadas[$i]["Parada"]);
        }
        $this->set("reservas_programadas", $reservas_programadas);

        $reservas_historial = $this->Reserva->findNoProgramadas($this->Session->read('phpCAS')["attributes"]["NumeroIdentificacion"]);
        for ($i = sizeof($reservas_historial) - 1; $i >= 0; $i--) {
            $reservas_historial[$i]["Recorrido"] = $this->Recorrido->find('first', array(
                        'conditions' => array("Recorrido.id_recorrido" => $reservas_historial[$i]["RecorridoRealizado"]["id_recorrido"]),
                        'recursive' => -1,
                    ))["Recorrido"];
            $reservas_historial[$i]["Ruta"] = $this->Ruta->find('first', array(
                        'conditions' => array("Ruta.id_ruta" => $reservas_historial[$i]["Recorrido"]["id_ruta"]),
                        'recursive' => -1,
                    ))["Ruta"];
            $reservas_historial[$i]["Horario"] = $this->Horario->find('first', array(
                        'conditions' => array("Horario.id_horario" => $reservas_historial[$i]["Recorrido"]["id_horario"]),
                        'recursive' => -1,
                    ))["Horario"];

            $this->RutaParada->unbindModel(
                    array('belongsTo' => array('Ruta'))
            );
            $paradas = $this->RutaParada->find('all', array(
                'conditions' => array("RutaParada.id_ruta" => $reservas_historial[$i]["Recorrido"]["id_ruta"]),
                'recursive' => 0,
                'order' => array('RutaParada.orden_ruta ASC'),
            ));
            if ($paradas[0]['RutaParada']['id_parada'] == Configure::read('Paradas.id_parada_eia_palmas')) {
                $reservas_historial[$i]["ParadaOrigen"] = $paradas[0]['Parada'];
                $reservas_historial[$i]["ParadaDestino"] = $reservas_historial[$i]["Parada"];
            } else {
                $reservas_historial[$i]["ParadaDestino"] = $paradas[sizeof($paradas) - 1]['Parada'];
                $reservas_historial[$i]["ParadaOrigen"] = $reservas_historial[$i]["Parada"];
            }
            unset($reservas_historial[$i]["Parada"]);
        }
        $this->set("reservas_historial", $reservas_historial);

        $recorridos_horarios = $this->Recorrido->findRutasHorariosRecorridosActivos();
        $rutas_id = array();
        foreach ($recorridos_horarios as $id_ruta => $horarios) {
            $rutas_id[] = $id_ruta;
        }
        $rutas_paradas = $this->RutaParada->find('all', array(
            'conditions' => array('RutaParada.id_ruta' => $rutas_id),
            'order' => array('RutaParada.id_ruta', 'RutaParada.orden_ruta')
        ));
        $rutas_waypoints_ayuda = $this->WaypointAyuda->find('all', array(
            'conditions' => array('WaypointAyuda.id_ruta' => $rutas_id),
            'order' => array('WaypointAyuda.id_ruta', 'WaypointAyuda.id_waypoint_ayuda', 'WaypointAyuda.id_waypoint_parada')
        ));
        $horarios = $this->Horario->find('all', array(
            'fields' => array('Horario.id_horario', 'Horario.dias_aplica', 'Horario.hora_salida'),
            'recursive' => -1,
        ));
        $rutas_paradas_horario = array();
        $i = 0;
        $j = 0;
        $rutas_paradas_length = sizeof($rutas_paradas);
        foreach ($recorridos_horarios as $id_ruta => $horarios_ruta) {
            $isRutaSetted = false;
            $direction = "haciaeia";
            if ($rutas_paradas[$j]['Parada']['id_parada'] == Configure::read('Paradas.id_parada_eia_palmas')) {
                $direction = "desdeeia";
            }
            for (; $j < $rutas_paradas_length; $j++) {
                if ($rutas_paradas[$j]['Ruta']['id_ruta'] == $id_ruta) {
                    if (!$isRutaSetted) {
                        $rutas_paradas_horario[$direction][$i]['Ruta'] = $rutas_paradas[$j]['Ruta'];
                        $isRutaSetted = true;

                        $rutas_paradas_horario[$direction][$i]['Origen'] = $rutas_paradas[$j]['Parada'];
                        $rutas_paradas_horario[$direction][$i]['Origen']['orden_ruta'] = $rutas_paradas[$j]['RutaParada']['orden_ruta'];
                        $rutas_paradas_horario[$direction][$i]['Origen']['tipo_parada'] = $rutas_paradas[$j]['RutaParada']['tipo_parada'];
                    } else {
                        $rutas_paradas_horario[$direction][$i]['Parada'][] = $rutas_paradas[$j]['Parada'];
                        $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]['orden_ruta'] = $rutas_paradas[$j]['RutaParada']['orden_ruta'];
                        $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]['tipo_parada'] = $rutas_paradas[$j]['RutaParada']['tipo_parada'];
                    }
                } else {
                    $rutas_paradas_horario[$direction][$i]['Destino'] = $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1];
                    unset($rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]);
                    break;
                }

                if ($j == $rutas_paradas_length - 1) {
                    $rutas_paradas_horario[$direction][$i]['Destino'] = $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1];
                    unset($rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]);
                }
            }

            $rutas_paradas_horario[$direction][$i]['WaypointAyuda'] = array();
            foreach ($rutas_waypoints_ayuda as $waypoint_ayuda) {
                if ($waypoint_ayuda['WaypointAyuda']['id_ruta'] == $id_ruta) {
                    $rutas_paradas_horario[$direction][$i]['WaypointAyuda'][] = $waypoint_ayuda['WaypointAyuda'];
                }
            }

            foreach ($horarios as $horario) {
                foreach ($horarios_ruta as $k => $id_horario) {
                    if ($horario['Horario']['id_horario'] == $id_horario) {
                        $rutas_paradas_horario[$direction][$i]['Horario'][] = $horario['Horario'];
                    }
                }
            }
            $i++;
        }
        $this->set("rutas_paradas_horario", $rutas_paradas_horario);

        $this->set("reservas_max_days_limit", Configure::read("Reservas.make_date_limit"));
        $this->set("reservas_min_hours_limit", Configure::read("Reservas.make_time_deadline"));
    }

    public function data() {
        if ($this->request->is("ajax")) {
            $this->layout = "ajax";

            $recorridos_realizados = $this->RecorridoRealizado->findNoFinalizadosAndNoProgramados();
            $length = sizeof($recorridos_realizados);
            for ($i = 0; $i < $length; $i++) {
                $ruta_parada = $this->RutaParada->find('first', array(
                    'conditions' => array(
                        'RutaParada.id_ruta' => $recorridos_realizados[$i]["Recorrido"]["id_ruta"]
                    ),
                    'order' => array('orden_ruta DESC')
                ));
                $recorridos_realizados[$i]["Ruta"] = $ruta_parada["Ruta"];
                $recorridos_realizados[$i]["ParadaDestino"] = $ruta_parada["Parada"];

                $horario = $this->Horario->find('first', array(
                    'conditions' => array(
                        'Horario.id_horario' => $recorridos_realizados[$i]["Recorrido"]["id_horario"]
                    ),
                    'recursive' => 0
                ));
                $recorridos_realizados[$i]["Horario"] = $horario["Horario"];
                if ($recorridos_realizados[$i]["RecorridoRealizado"]["estado_recorrido_realizado"] == 'evento') {
                    $recorrido_realizado_evento = $this->RecorridoRealizadoEvento->find('first', array(
                        'conditions' => array(
                            'RecorridoRealizadoEvento.id_recorrido_realizado' => $recorridos_realizados[$i]["RecorridoRealizado"]["id_recorrido_realizado"]
                        ),
                        'order' => array('RecorridoRealizadoEvento.fecha_hora_evento DESC')
                    ));
                    $recorridos_realizados[$i]["Evento"] = $recorrido_realizado_evento["Evento"];
                }
            }
            $this->set("recorridos_realizados", $recorridos_realizados);

            $recorridos_horarios = $this->Recorrido->findRutasHorariosRecorridosActivos();
            $rutas_id = array();
            foreach ($recorridos_horarios as $id_ruta => $horarios) {
                $rutas_id[] = $id_ruta;
            }
            $rutas_paradas = $this->RutaParada->find('all', array(
                'conditions' => array('RutaParada.id_ruta' => $rutas_id),
                'order' => array('RutaParada.id_ruta', 'RutaParada.orden_ruta')
            ));
            $rutas_waypoints_ayuda = $this->WaypointAyuda->find('all', array(
                'conditions' => array('WaypointAyuda.id_ruta' => $rutas_id),
                'order' => array('WaypointAyuda.id_ruta', 'WaypointAyuda.id_waypoint_ayuda', 'WaypointAyuda.id_waypoint_parada')
            ));
            $horarios = $this->Horario->find('all', array(
                'fields' => array('Horario.id_horario', 'Horario.dias_aplica', 'Horario.hora_salida'),
                'recursive' => -1,
            ));
            $rutas_paradas_horario = array();
            $i = 0;
            $j = 0;
            $rutas_paradas_length = sizeof($rutas_paradas);
            foreach ($recorridos_horarios as $id_ruta => $horarios_ruta) {
                $isRutaSetted = false;
                $direction = "haciaeia";
                if ($rutas_paradas[$j]['Parada']['id_parada'] == Configure::read('Paradas.id_parada_eia_palmas')) {
                    $direction = "desdeeia";
                }
                for (; $j < $rutas_paradas_length; $j++) {
                    if ($rutas_paradas[$j]['Ruta']['id_ruta'] == $id_ruta) {
                        if (!$isRutaSetted) {
                            $rutas_paradas_horario[$direction][$i]['Ruta'] = $rutas_paradas[$j]['Ruta'];
                            $isRutaSetted = true;

                            $rutas_paradas_horario[$direction][$i]['Origen'] = $rutas_paradas[$j]['Parada'];
                            $rutas_paradas_horario[$direction][$i]['Origen']['orden_ruta'] = $rutas_paradas[$j]['RutaParada']['orden_ruta'];
                            $rutas_paradas_horario[$direction][$i]['Origen']['tipo_parada'] = $rutas_paradas[$j]['RutaParada']['tipo_parada'];
                        } else {
                            $rutas_paradas_horario[$direction][$i]['Parada'][] = $rutas_paradas[$j]['Parada'];
                            $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]['orden_ruta'] = $rutas_paradas[$j]['RutaParada']['orden_ruta'];
                            $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]['tipo_parada'] = $rutas_paradas[$j]['RutaParada']['tipo_parada'];
                        }
                    } else {
                        $rutas_paradas_horario[$direction][$i]['Destino'] = $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1];
                        unset($rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]);
                        break;
                    }

                    if ($j == $rutas_paradas_length - 1) {
                        $rutas_paradas_horario[$direction][$i]['Destino'] = $rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1];
                        unset($rutas_paradas_horario[$direction][$i]['Parada'][sizeof($rutas_paradas_horario[$direction][$i]['Parada']) - 1]);
                    }
                }

                $rutas_paradas_horario[$direction][$i]['WaypointAyuda'] = array();
                foreach ($rutas_waypoints_ayuda as $waypoint_ayuda) {
                    if ($waypoint_ayuda['WaypointAyuda']['id_ruta'] == $id_ruta) {
                        $rutas_paradas_horario[$direction][$i]['WaypointAyuda'][] = $waypoint_ayuda['WaypointAyuda'];
                    }
                }

                foreach ($horarios as $horario) {
                    foreach ($horarios_ruta as $k => $id_horario) {
                        if ($horario['Horario']['id_horario'] == $id_horario) {
                            $rutas_paradas_horario[$direction][$i]['Horario'][] = $horario['Horario'];
                        }
                    }
                }
                $i++;
            }
            $this->set("rutas_paradas_horario", $rutas_paradas_horario);
        } else {
            echo "{}";
            $this->autoRender = false;
        }
    }

    public function administrar() {

    }

    /**
     * Visualiza las reservas del usuario que llama este action
     *
     * Se hace un find para encontrar las reservas del usuario adecuado
     * luego se pasan a la vista para que sean mostradas
     *
     */
    public function mis_reservas_completas() {
        $this->layout = "miBus";
    }

    public function retrieve_all_mis_reservas() {
        if ($this->request->is('ajax')) {
            $data = $this->request->data;

            foreach ($data['order'] as $i => $order) {
                $data['order'][$i] = array(
                    'column' => $data['columns'][$data['order'][$i]['column']]['data'],
                    'direction' => strtoupper($data['order'][$i]['dir'])
                );
            }

            $filter = array();
            foreach ($data['columns'] as $i => $column) {
                if ($column['searchable'] === "true" && !empty($column['search']['value'])) {
                    $filter[] = array(
                        'column' => $column['name'],
                        'value' => $column['search']['value']
                    );
                }
            }

            $models = $this->Reserva->findAllByIdUsuario($this->Session->read('phpCAS')["attributes"]["NumeroIdentificacion"], $start = $data['start'], $length = $data['length'], $order = $data['order'], $filter);
            foreach ($models as $i => &$array) {
                $models[$i]['Ruta'] = $array['RecorridoRealizado']['Recorrido']['Ruta'];
                unset($array['RecorridoRealizado']['Recorrido']['Ruta']);
                $models[$i]['Recorrido'] = $array['RecorridoRealizado']['Recorrido'];
                unset($array['RecorridoRealizado']['Recorrido']);
            }
            $totalWithFilter = $this->Reserva->findCountAllByIdUsuario($this->Session->read('phpCAS')["attributes"]["NumeroIdentificacion"], $filter);
            $total = $this->Reserva->findCountAllByIdUsuario($this->Session->read('phpCAS')["attributes"]["NumeroIdentificacion"]);

            $this->set(array(
                'draw' => $data['draw'],
                'results' => $models,
                'recordsTotal' => $total,
                'recordsFiltered' => $totalWithFilter
            ));
            $this->set('_serialize', array('results', 'recordsTotal', 'draw', 'recordsFiltered'));
        } else {
            $this->autoRender = false;
        }
    }

}
